package com.wn.framework.ext

import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.*

/**
 * @Author: wn
 * @Date: 2024/8/23 17:22
 * @Description: 倒计时 函数
 */
fun countDownCoroutines(
  total: Int,
  scope: CoroutineScope,
  onTick: (Int) -> Unit,
  onStart: (() -> Unit)? = null,
  onFinish: (() -> Unit)? = null,
): Job = flow {
  for (i in total downTo 1) {
    emit(i)
    delay(1000)
  }
}
  .flowOn(Dispatchers.IO)
  .onStart { onStart?.invoke() }
  .onEach { onTick(it) }
  .onCompletion { onFinish?.invoke() }
  .launchIn(scope)
// 在指定协程作用域 收集 流 ,相当于 scope.launch{ flow.collect } 终止操作
// 所以一般搭配 onEach 一起使用 ,onEach { 执行 collect 中的操作}